home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / program / swagn_r.zip / POINTERS.SWG / 0009_Generic Linked List.pas < prev    next >
Pascal/Delphi Source File  |  1993-06-22  |  4KB  |  196 lines

  1. UNIT LinkList;
  2.  
  3. {-------------------------------------------------
  4.           Generic linked list object            -
  5. -------------------------------------------------}
  6.  
  7. {***************************************************************}
  8.                           INTERFACE
  9. {***************************************************************}
  10.  
  11. TYPE
  12.  
  13.     { Generic Linked List Handler Definition }
  14.  
  15.   NodeValuePtr = ^NodeValue;
  16.  
  17.   NodeValue = OBJECT
  18.     CONSTRUCTOR Init;
  19.     DESTRUCTOR  Done; VIRTUAL;
  20.   END;
  21.  
  22.   NodePtr = ^Node;
  23.   Node = RECORD
  24.     Retrieve : NodeValuePtr;
  25.     Next     : NodePtr;
  26.   END;
  27.  
  28.  
  29.     { Specific Linked List Handler Definition }
  30.  
  31.   NodeListPtr = ^NodeList;
  32.  
  33.   NodeList = OBJECT
  34.     Items : NodePtr;
  35.     CONSTRUCTOR Init;
  36.     DESTRUCTOR Done; VIRTUAL;
  37.     PROCEDURE Add (A_Value : NodeValuePtr);
  38.  
  39.     (* Iterator Functions *)
  40.  
  41.     PROCEDURE StartIterator (VAR Ptr : NodePtr);
  42.     PROCEDURE NextValue (VAR Ptr : NodePtr);
  43.     FUNCTION AtEndOfList (Ptr : NodePtr) : Boolean;
  44.   END;
  45.  
  46. {***************************************************************}
  47.                          IMPLEMENTATION
  48. {***************************************************************}
  49.  
  50.  
  51. CONSTRUCTOR NodeValue.Init;
  52. BEGIN
  53. END;
  54.  
  55. DESTRUCTOR NodeValue.Done;
  56. BEGIN
  57. END;
  58.  
  59. CONSTRUCTOR NodeList.Init;
  60. BEGIN
  61.   Items := NIL;
  62. END;
  63.  
  64. DESTRUCTOR NodeList.Done;
  65.     VAR
  66.          Temp : NodePtr;
  67. BEGIN
  68.     WHILE Items <> NIL DO
  69.     BEGIN
  70.          Temp := Items;
  71.          IF Temp^.Retrieve <> NIL THEN
  72.               Dispose (Temp^.Retrieve, Done);
  73.          Items := Items^.Next;
  74.          Dispose (Temp);
  75.     END;
  76. END;
  77.  
  78. PROCEDURE NodeList.Add (A_Value : NodeValuePtr);
  79.     VAR
  80.          Cell : NodePtr;
  81.          Temp : NodePtr;
  82. BEGIN
  83.     (* Go TO the END OF the linked list. *)
  84.     Cell := Items;
  85.     IF Cell <> NIL THEN
  86.          WHILE Cell^.Next <> NIL DO
  87.               Cell := Cell^.Next;
  88.  
  89.     New (Temp);
  90.     Temp^.Retrieve := A_Value;
  91.     Temp^.Next := NIL;
  92.     IF Items = NIL
  93.     THEN
  94.          Items := Temp
  95.     ELSE
  96.          Cell^.Next := Temp;
  97. END;
  98.  
  99. PROCEDURE NodeList.StartIterator (VAR Ptr : NodePtr);
  100. BEGIN
  101.     Ptr := Items;
  102. END;
  103.  
  104. PROCEDURE NodeList.NextValue (VAR Ptr : NodePtr);
  105. BEGIN
  106.     IF Ptr <> NIL THEN
  107.     Ptr := Ptr^.Next;
  108. END;
  109.  
  110. FUNCTION NodeList.AtEndOfList (Ptr : NodePtr) : Boolean;
  111. BEGIN
  112.   AtEndOfList := (Ptr = NIL);
  113. END;
  114.  
  115. END.
  116.  
  117. { DEMO PROGRAM }
  118.  
  119. PROGRAM LL_Demo;
  120.  
  121. USES LinkList;
  122.  
  123. { Turbo Pascal Linked List Object Example }
  124.  
  125. TYPE
  126.  
  127.   DataValuePtr = ^DataValue;
  128.  
  129.   DataValue = OBJECT (NodeValue)
  130.     Value : Real;
  131.     CONSTRUCTOR Init (A_Value : Real);
  132.     FUNCTION TheValue : Real;
  133.   END;
  134.  
  135.   DataList = OBJECT (NodeList)
  136.     FUNCTION CurrentValue (Ptr : NodePtr) : Real;
  137.     PROCEDURE SetCurrentValue (Ptr : NodePtr; Value : Real);
  138.   END;
  139.  
  140. VAR
  141.     Itr : NodePtr;
  142.     TestLink : DataList;
  143.  
  144. {------ Unique methods to create for your linked list type -----}
  145.  
  146. CONSTRUCTOR DataValue.Init (A_Value : Real);
  147. BEGIN
  148.     Value := A_Value;
  149. END;
  150.  
  151. FUNCTION DataValue.TheValue : Real;
  152. BEGIN
  153.   TheValue := Value;
  154. END;
  155.  
  156. FUNCTION DataList.CurrentValue (Ptr : NodePtr) : Real;
  157. BEGIN
  158.   CurrentValue := DataValuePtr (Ptr^.Retrieve)^.TheValue;
  159. END;
  160.  
  161. PROCEDURE DataList.SetCurrentValue (Ptr : NodePtr; Value : Real);
  162. BEGIN
  163.   DataValuePtr (Ptr^.Retrieve)^.Value := Value;
  164. END;
  165.  
  166.  
  167. BEGIN
  168.   TestLink.Init;        {Create the list then add 5 values to it}
  169.  
  170.   TestLink.Add (New (DataValuePtr, Init (1.0)));
  171.   TestLink.Add (New (DataValuePtr, Init (2.0)));
  172.   TestLink.Add (New (DataValuePtr, Init (3.0)));
  173.   TestLink.Add (New (DataValuePtr, Init (4.0)));
  174.   TestLink.Add (New (DataValuePtr, Init (5.0)));
  175.  
  176.   TestLink.StartIterator (Itr);      {Display the list on screen}
  177.   WHILE NOT TestLink.AtEndOfList (Itr) DO BEGIN
  178.     Write (TestLink.CurrentValue (Itr) : 5 : 1);
  179.     TestLink.NextValue (Itr);
  180.     END;
  181.   WriteLn;
  182.  
  183.   TestLink.StartIterator (Itr);  {Change some values in the list}
  184.   TestLink.SetCurrentValue (Itr, 0.0);
  185.   TestLink.NextValue (Itr);
  186.   TestLink.SetCurrentValue (Itr, -1.0);
  187.  
  188.   TestLink.StartIterator (Itr);       {Redisplay the list values}
  189.   WHILE NOT TestLink.AtEndOfList (Itr) DO BEGIN
  190.     Write (TestLink.CurrentValue (Itr) : 5 : 1);
  191.     TestLink.NextValue (Itr);
  192.   END;
  193.   WriteLn;
  194.   ReadLn;
  195. END.
  196.